package com.atguigu.java;

import org.junit.Test;

import java.io.*;

/**
 * 其他流的使用
 * 1.标准的输入输出流
 * 2.打印流
 * 3.数据流
 *
 * @author shkstart
 * @create 2021-01-27 23:34
 */
public class OtherStreamTest {
    /*
     *
     * 1.标准的输入输出流
     * System.in 默认从键盘输入
     * Systemi.out  默认从控制台输出
     * 1.2
     * System类中的 setIn（InputStream  is）和setOut(OutStream  os)方式 重新指定输入输出流
     *
     * 1.3练习
     * 从键盘输入字符串，要求将读取到的整行字符串转换成大写输出，然后继续进行输入操作，直至当输入“e” / “exit”时 ，退出程序
     *
     * 方法一： Scanner实现
     * 方法二：System。in实现  System.in-->转换流---》BufferenReder 的 readLine（）；
     *
     * */
    public static void main(String[] args) {


        BufferedReader bufferedReader = null;
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(System.in);
            bufferedReader = new BufferedReader(inputStreamReader);

            while (true) {
                System.out.println("请输入字符串");
                String data = bufferedReader.readLine();
                if (data.equalsIgnoreCase("e") || data.equalsIgnoreCase("exit")) {
                    System.out.println("程序结束");
                    return;
                }
                String up = data.toUpperCase();
                System.out.println(up);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /*
     * 2。打印流
     *printStream 和 printWriter
     *
     * 2.1提供了一系列重载的 print() 和 println()
     * 练习
     *
     * */
    @Test
    public void test2() {
        PrintStream ps = null;
        try {
            File file = new File("hello.txt");
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            //创建打印输出流，设置为自动刷新模式（写入换行符‘\n’时都会刷新缓冲区）
            ps = new PrintStream(fileOutputStream, true);

            if (ps != null) {//把标准输出流（控制台输出）改成文件
                System.setOut(ps);
            }

            for (int i = 0; i < 255; i++) { //输出ASCII字符
                System.out.println((char) i);
                if (i % 50 == 0) {
                    System.out.println();
                }

            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ps != null)
                try {
                    ps.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }

    }

    /*
     *
     * 3.数据流
     * 3.1 DateInputStream  和 DateOutputStream
     * 3.2作用
     *       用于读取或写出基本数据类型或引用数据类型
     *练习： 将内存中的字符串，基本数据类型变量写到文件中
     *
     * 处理异常必须用try-catch-finally 此处省略 因为懒
     *
     * */
    @Test
    public void test3() throws IOException {
        DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("woshifather.txt"));

        dataOutputStream.writeUTF("小明");
        dataOutputStream.flush();

        dataOutputStream.writeByte(78);
        dataOutputStream.flush();
        dataOutputStream.writeShort(15);
        dataOutputStream.flush();

        dataOutputStream.close();
    }

    /*
     *
     * 将文件中存储的基本数据类型和引用数据类型读取到内存中，保存在变量中
     *
     * 注意：读取不同类型的数据的顺序要和写出的顺序一致。
     *
     * */
    @Test
    public void test4() throws IOException {
        DataInputStream dataInputStream = new DataInputStream(new FileInputStream("woshifather.txt"));
        String s = dataInputStream.readUTF();
        byte b = dataInputStream.readByte();
        int i = dataInputStream.readShort();
        System.out.println("name" + s);
        System.out.println("年龄" + b);
        System.out.println("长短：" + i);

        dataInputStream.close();

    }

}
